home *** CD-ROM | disk | FTP | other *** search
/ The CICA Windows Explosion! / The CICA Windows Explosion! - Disc 2.iso / winsock / ircii2-6.zip / SRC\IRCII-2.6\SOURCE\VARS.C < prev    next >
C/C++ Source or Header  |  1995-01-09  |  23KB  |  724 lines

  1. /*
  2.  * vars.c: All the dealing of the irc variables are handled here. 
  3.  *
  4.  *
  5.  * Written By Michael Sandrof
  6.  *
  7.  * Copyright(c) 1990 
  8.  *
  9.  * See the COPYRIGHT file, or do a HELP IRCII COPYRIGHT 
  10.  */
  11.  
  12. #ifndef lint
  13. static    char    rcsid[] = "@(#)$Id: vars.c,v 1.15 1994/07/02 02:32:13 mrg Stab $";
  14. #endif
  15.  
  16. #include "irc.h"
  17.  
  18. #include "status.h"
  19. #include "window.h"
  20. #include "lastlog.h"
  21. #include "log.h"
  22. #include "crypt.h"
  23. #include "history.h"
  24. #include "notify.h"
  25. #include "vars.h"
  26. #include "input.h"
  27. #include "ircaux.h"
  28. #include "whois.h"
  29. #include "translat.h"
  30. #include "term.h"
  31. #include "output.h"
  32.  
  33. /* IrcVariable: structure for each variable in the variable table */
  34. typedef struct
  35. {
  36.     char    *name;        /* what the user types */
  37.     int    type;        /* variable types, see below */
  38.     int    integer;    /* int value of variable */
  39.     char    *string;    /* string value of variable */
  40.     void    (*func) ();    /* function to do every time variable is set */
  41.     char    int_flags;    /* internal flags to the variable */
  42.     unsigned short    flags;    /* flags for this variable */
  43. }    IrcVariable;
  44.  
  45. #define    VF_NODAEMON    0x0001
  46.  
  47. #define VIF_CHANGED    0x01
  48. #define VIF_GLOBAL    0x02
  49.  
  50. /* the types of IrcVariables */
  51. #define BOOL_TYPE_VAR 0
  52. #define CHAR_TYPE_VAR 1
  53. #define INT_TYPE_VAR 2
  54. #define STR_TYPE_VAR 3
  55.  
  56. char    *var_settings[] =
  57. {
  58.     "OFF", "ON", "TOGGLE"
  59. };
  60.  
  61. /* For the NOVICE variable. Complain loudlly if turned off manually.  */
  62. extern    int    load_depth;
  63.  
  64.     int    loading_global = 0;
  65.  
  66. static    void    exec_warning();
  67. static    void    input_warning();
  68. static    void    eight_bit_characters();
  69. static    void    set_realname __P((char *));
  70.  
  71. #ifdef _Windows
  72. extern    char *get_ini_value(char *pchEntry);
  73. #endif
  74.  
  75. /*
  76.  * irc_variable: all the irc variables used.  Note that the integer and
  77.  * boolean defaults are set here, which the string default value are set in
  78.  * the init_variables() procedure 
  79.  */
  80. static    IrcVariable irc_variable[] =
  81. {
  82.     { "ALWAYS_SPLIT_BIGGEST",    BOOL_TYPE_VAR,    DEFAULT_ALWAYS_SPLIT_BIGGEST, NULL, NULL, 0, 0 },
  83.     { "AUTO_UNMARK_AWAY",        BOOL_TYPE_VAR,    DEFAULT_AUTO_UNMARK_AWAY, NULL, NULL, 0, 0 },
  84.     { "AUTO_WHOWAS",        BOOL_TYPE_VAR,    DEFAULT_AUTO_WHOWAS, NULL, NULL, 0, 0 },
  85.     { "BEEP",            BOOL_TYPE_VAR,    DEFAULT_BEEP, NULL, NULL, 0, 0 },
  86.     { "BEEP_MAX",            INT_TYPE_VAR,    DEFAULT_BEEP_MAX, NULL, NULL, 0, 0 },
  87.     { "BEEP_ON_MSG",        STR_TYPE_VAR,    0, NULL, set_beep_on_msg, 0, 0 },
  88.     { "BEEP_WHEN_AWAY",        INT_TYPE_VAR,    DEFAULT_BEEP_WHEN_AWAY, NULL, NULL, 0, 0 },
  89.     { "BOLD_VIDEO",            BOOL_TYPE_VAR,    DEFAULT_BOLD_VIDEO, NULL, NULL, 0, 0 },
  90.     { "CHANNEL_NAME_WIDTH",        INT_TYPE_VAR,    DEFAULT_CHANNEL_NAME_WIDTH, NULL, update_all_status, 0, 0 },
  91.     { "CLIENT_INFORMATION",        STR_TYPE_VAR,    0, NULL, NULL, 0, 0 },
  92.     { "CLOCK",            BOOL_TYPE_VAR,    DEFAULT_CLOCK, NULL, update_all_status, 0, 0 },
  93.     { "CLOCK_24HOUR",        BOOL_TYPE_VAR,    DEFAULT_CLOCK_24HOUR, NULL, reset_clock, 0, 0 },
  94.     { "CLOCK_ALARM",        STR_TYPE_VAR,    0, NULL, set_alarm, 0, 0 },
  95.     { "CMDCHARS",            STR_TYPE_VAR,    0, NULL, NULL, 0, 0 },
  96.     { "COMMAND_MODE",        BOOL_TYPE_VAR,    DEFAULT_COMMAND_MODE, NULL, NULL, 0, 0 },
  97.     { "CONTINUED_LINE",        STR_TYPE_VAR,    0, NULL, set_continued_line, 0, 0 },
  98.     { "DCC_BLOCK_SIZE",        INT_TYPE_VAR,    DEFAULT_DCC_BLOCK_SIZE, NULL, NULL, 0, 0 },
  99.     { "DEBUG",            INT_TYPE_VAR,    0, NULL, NULL, 0, 0 },
  100.     { "DISPLAY",            BOOL_TYPE_VAR,    DEFAULT_DISPLAY, NULL, NULL, 0, 0 },
  101.     { "EIGHT_BIT_CHARACTERS",    BOOL_TYPE_VAR,    DEFAULT_EIGHT_BIT_CHARACTERS, NULL, eight_bit_characters, 0, 0 },
  102.     { "ENCRYPT_PROGRAM",        STR_TYPE_VAR,    0, NULL, NULL, 0, VF_NODAEMON },
  103.     { "EXEC_PROTECTION",        BOOL_TYPE_VAR,    DEFAULT_EXEC_PROTECTION, NULL, exec_warning, 0, VF_NODAEMON },
  104.     { "FLOOD_AFTER",        INT_TYPE_VAR,    DEFAULT_FLOOD_AFTER, NULL, NULL, 0, 0 },
  105.     { "FLOOD_RATE",            INT_TYPE_VAR,    DEFAULT_FLOOD_RATE, NULL, NULL, 0, 0 },
  106.     { "FLOOD_USERS",        INT_TYPE_VAR,    DEFAULT_FLOOD_USERS, NULL, NULL, 0, 0 },
  107.     { "FLOOD_WARNING",        BOOL_TYPE_VAR,    DEFAULT_FLOOD_WARNING, NULL, NULL, 0, 0 },
  108.     { "FULL_STATUS_LINE",        BOOL_TYPE_VAR,    DEFAULT_FULL_STATUS_LINE, NULL, update_all_status, 0, 0 },
  109.     { "HELP_PAGER",            BOOL_TYPE_VAR,    DEFAULT_HELP_PAGER, NULL, NULL, 0, 0 },
  110.     { "HELP_PATH",            STR_TYPE_VAR,    0, NULL, NULL, 0, VF_NODAEMON },
  111.     { "HELP_PROMPT",        BOOL_TYPE_VAR,    DEFAULT_HELP_PROMPT, NULL, NULL, 0, 0 },
  112.     { "HELP_SERVICE",        STR_TYPE_VAR,    0, NULL, NULL, 0, 0 },
  113.     { "HELP_WINDOW",        BOOL_TYPE_VAR,    DEFAULT_HELP_WINDOW, NULL, NULL, 0, 0 },
  114.     { "HIDE_PRIVATE_CHANNELS",    BOOL_TYPE_VAR,    DEFAULT_HIDE_PRIVATE_CHANNELS, NULL, update_all_status, 0, 0 },
  115.     { "HIGHLIGHT_CHAR",        STR_TYPE_VAR,    0, NULL, set_highlight_char, 0, 0 },
  116.     { "HISTORY",            INT_TYPE_VAR,    DEFAULT_HISTORY, NULL, set_history_size, 0, VF_NODAEMON },
  117.     { "HISTORY_FILE",        STR_TYPE_VAR,    0, NULL, set_history_file, 0, 0 },
  118.     { "HOLD_MODE",            BOOL_TYPE_VAR,    DEFAULT_HOLD_MODE, NULL, reset_line_cnt, 0, 0 },
  119.     { "HOLD_MODE_MAX",        INT_TYPE_VAR,    DEFAULT_HOLD_MODE_MAX, NULL, NULL, 0, 0 },
  120.     { "INDENT",            BOOL_TYPE_VAR,    DEFAULT_INDENT, NULL, NULL, 0, 0 },
  121.     { "INPUT_ALIASES",        BOOL_TYPE_VAR,    DEFAULT_INPUT_ALIASES, NULL, NULL, 0, 0 },
  122.     { "INPUT_PROMPT",        STR_TYPE_VAR,    0, NULL, set_input_prompt, 0, 0 },
  123.     { "INPUT_PROTECTION",        BOOL_TYPE_VAR,    DEFAULT_INPUT_PROTECTION, NULL, input_warning, 0, 0 },
  124.     { "INSERT_MODE",        BOOL_TYPE_VAR,    DEFAULT_INSERT_MODE, NULL, update_all_status, 0, 0 },
  125.     { "INVERSE_VIDEO",        BOOL_TYPE_VAR,    DEFAULT_INVERSE_VIDEO, NULL, NULL, 0, 0 },
  126.     { "LASTLOG",            INT_TYPE_VAR,    DEFAULT_LASTLOG, NULL, set_lastlog_size, 0, 0 },
  127.     { "LASTLOG_LEVEL",        STR_TYPE_VAR,    0, NULL, set_lastlog_level, 0, 0 },
  128.     { "LOAD_PATH",            STR_TYPE_VAR,    0, NULL, NULL, 0, VF_NODAEMON },
  129.     { "LOG",            BOOL_TYPE_VAR,    DEFAULT_LOG, NULL, logger, 0, 0 },
  130.     { "LOGFILE",            STR_TYPE_VAR,    0, NULL, NULL, 0, VF_NODAEMON },
  131.     { "MAIL",            INT_TYPE_VAR,    DEFAULT_MAIL, NULL, update_all_status, 0, VF_NODAEMON },
  132.     { "MAX_RECURSIONS",        INT_TYPE_VAR,    DEFAULT_MAX_RECURSIONS, NULL, NULL, 0, 0 },
  133.     { "MENU",            STR_TYPE_VAR,    0, NULL, set_menu, 0, 0 },
  134.     { "MINIMUM_SERVERS",        INT_TYPE_VAR,    DEFAULT_MINIMUM_SERVERS, NULL, NULL, 0, VF_NODAEMON },
  135.     { "MINIMUM_USERS",        INT_TYPE_VAR,    DEFAULT_MINIMUM_USERS, NULL, NULL, 0, VF_NODAEMON },
  136.     { "NO_CTCP_FLOOD",        BOOL_TYPE_VAR,    DEFAULT_NO_CTCP_FLOOD, NULL, NULL, 0, 0 },
  137.     { "NOTIFY_HANDLER",        STR_TYPE_VAR,     0, 0, set_notify_handler, 0, 0 },
  138.     { "NOTIFY_LEVEL",        STR_TYPE_VAR,    0, NULL, set_notify_level, 0, 0 },
  139.     { "NOTIFY_ON_TERMINATION",    BOOL_TYPE_VAR,    DEFAULT_NOTIFY_ON_TERMINATION, NULL, NULL, 0, VF_NODAEMON },
  140.     { "NOVICE",            BOOL_TYPE_VAR,    1, NULL, NULL, 0, 0 },
  141.     { "REALNAME",            STR_TYPE_VAR,    0, 0, set_realname, 0, VF_NODAEMON },
  142.     { "SCROLL",            BOOL_TYPE_VAR,    DEFAULT_SCROLL, NULL, set_scroll, 0, 0 },
  143.     { "SCROLL_LINES",        INT_TYPE_VAR,    DEFAULT_SCROLL_LINES, NULL, set_scroll_lines, 0, 0 },
  144.     { "SEND_IGNORE_MSG",        BOOL_TYPE_VAR,    DEFAULT_SEND_IGNORE_MSG, NULL, NULL, 0, 0 },
  145.     { "SHELL",            STR_TYPE_VAR,    0, NULL, NULL, 0, VF_NODAEMON },
  146.     { "SHELL_FLAGS",        STR_TYPE_VAR,    0, NULL, NULL, 0, VF_NODAEMON },
  147.     { "SHELL_LIMIT",        INT_TYPE_VAR,    DEFAULT_SHELL_LIMIT, NULL, NULL, 0, VF_NODAEMON },
  148.     { "SHOW_AWAY_ONCE",        BOOL_TYPE_VAR,    DEFAULT_SHOW_AWAY_ONCE, NULL, NULL, 0, 0 },
  149.     { "SHOW_CHANNEL_NAMES",        BOOL_TYPE_VAR,    DEFAULT_SHOW_CHANNEL_NAMES, NULL, NULL, 0, 0 },
  150.     { "SHOW_END_OF_MSGS",        BOOL_TYPE_VAR,    DEFAULT_SHOW_END_OF_MSGS, NULL, NULL, 0, 0 },
  151.     { "SHOW_NUMERICS",        BOOL_TYPE_VAR,    DEFAULT_SHOW_NUMERICS, NULL, NULL, 0, 0 },
  152.     { "SHOW_STATUS_ALL",        BOOL_TYPE_VAR,    DEFAULT_SHOW_STATUS_ALL, NULL, update_all_status, 0, 0 },
  153.     { "SHOW_WHO_HOPCOUNT",         BOOL_TYPE_VAR,    DEFAULT_SHOW_WHO_HOPCOUNT, NULL, NULL, 0, 0 },
  154.     { "STATUS_AWAY",        STR_TYPE_VAR,    0, NULL, build_status, 0, 0 },
  155.     { "STATUS_CHANNEL",        STR_TYPE_VAR,    0, NULL, build_status, 0, 0 },
  156.     { "STATUS_CHANOP",        STR_TYPE_VAR,    0, NULL, build_status, 0, 0 },
  157.     { "STATUS_CLOCK",        STR_TYPE_VAR,    0, NULL, build_status, 0, 0 },
  158.     { "STATUS_FORMAT",        STR_TYPE_VAR,    0, NULL, build_status, 0, 0 },
  159.     { "STATUS_HOLD",        STR_TYPE_VAR,    0, NULL, build_status, 0, 0 },
  160.     { "STATUS_HOLD_LINES",        STR_TYPE_VAR,    0, NULL, build_status, 0, 0 },
  161.     { "STATUS_INSERT",        STR_TYPE_VAR,    0, NULL, build_status, 0, 0 },
  162.     { "STATUS_MAIL",        STR_TYPE_VAR,    0, NULL, build_status, 0, VF_NODAEMON },
  163.     { "STATUS_MODE",        STR_TYPE_VAR,    0, NULL, build_status, 0, 0 },
  164.     { "STATUS_NOTIFY",        STR_TYPE_VAR,    0, NULL, build_status, 0, 0 },
  165.     { "STATUS_OPER",        STR_TYPE_VAR,    0, NULL, build_status, 0, 0 },
  166.     { "STATUS_OVERWRITE",        STR_TYPE_VAR,    0, NULL, build_status, 0, 0 },
  167.     { "STATUS_QUERY",        STR_TYPE_VAR,    0, NULL, build_status, 0, 0 },
  168.     { "STATUS_SERVER",        STR_TYPE_VAR,    0, NULL, build_status, 0, 0 },
  169.     { "STATUS_UMODE",        STR_TYPE_VAR,    0, NULL, build_status, 0, 0 },
  170.     { "STATUS_USER",        STR_TYPE_VAR,    0, NULL, build_status, 0, 0 },
  171.     { "STATUS_USER1",        STR_TYPE_VAR,    0, NULL, build_status, 0, 0 },
  172.     { "STATUS_USER2",        STR_TYPE_VAR,    0, NULL, build_status, 0, 0 },
  173.     { "STATUS_USER3",        STR_TYPE_VAR,    0, NULL, build_status, 0, 0 },
  174.     { "STATUS_WINDOW",        STR_TYPE_VAR,    0, NULL, build_status, 0, 0 },
  175.     { "SUPPRESS_SERVER_MOTD",    BOOL_TYPE_VAR,    DEFAULT_SUPPRESS_SERVER_MOTD, NULL, NULL, 0, VF_NODAEMON },
  176.     { "TAB",            BOOL_TYPE_VAR,    DEFAULT_TAB, NULL, NULL, 0, 0 },
  177.     { "TAB_MAX",            INT_TYPE_VAR,    DEFAULT_TAB_MAX, NULL, NULL, 0, 0 },
  178.     { "TRANSLATION",        STR_TYPE_VAR,    0, NULL, set_translation, 0, 0 },
  179.     { "UNDERLINE_VIDEO",        BOOL_TYPE_VAR,    DEFAULT_UNDERLINE_VIDEO, NULL, NULL, 0, 0 },
  180.     { "USE_OLD_MSG",        BOOL_TYPE_VAR,    DEFAULT_USE_OLD_MSG, NULL, NULL, 0, 0 },
  181.     { "USER_INFORMATION",         STR_TYPE_VAR,    0, NULL, NULL, 0, 0 },
  182.     { "USER_WALLOPS",        BOOL_TYPE_VAR,    DEFAULT_USER_WALLOPS, NULL, NULL, 0, 0 },
  183.     { "VERBOSE_CTCP",        BOOL_TYPE_VAR,    DEFAULT_VERBOSE_CTCP, NULL, NULL, 0, 0 },
  184.     { "WARN_OF_IGNORES",        BOOL_TYPE_VAR,    DEFAULT_WARN_OF_IGNORES, NULL, NULL, 0, 0 },
  185.     { "XTERM_OPTIONS",         STR_TYPE_VAR,    0, NULL, NULL, 0, VF_NODAEMON },
  186.     { (char *) 0, 0, 0, 0, 0, 0, 0 }
  187. };
  188.  
  189. /*
  190.  * init_variables: initializes the string variables that can't really be
  191.  * initialized properly above 
  192.  */
  193. void
  194. init_variables()
  195. {
  196.     set_string_var(CMDCHARS_VAR, DEFAULT_CMDCHARS);
  197.     set_string_var(LOGFILE_VAR, DEFAULT_LOGFILE);
  198.     set_string_var(SHELL_VAR, DEFAULT_SHELL);
  199.     set_string_var(SHELL_FLAGS_VAR, DEFAULT_SHELL_FLAGS);
  200.     set_string_var(ENCRYPT_PROGRAM_VAR, DEFAULT_ENCRYPT_PROGRAM);
  201.     set_string_var(CONTINUED_LINE_VAR, DEFAULT_CONTINUED_LINE);
  202.     set_string_var(INPUT_PROMPT_VAR, DEFAULT_INPUT_PROMPT);
  203.     set_string_var(HIGHLIGHT_CHAR_VAR, DEFAULT_HIGHLIGHT_CHAR);
  204.     set_string_var(HISTORY_FILE_VAR, DEFAULT_HISTORY_FILE);
  205.     set_string_var(LASTLOG_LEVEL_VAR, DEFAULT_LASTLOG_LEVEL);
  206.     set_string_var(NOTIFY_HANDLER_VAR, DEFAULT_NOTIFY_HANDLER);
  207.     set_string_var(NOTIFY_LEVEL_VAR, DEFAULT_NOTIFY_LEVEL);
  208.     set_string_var(REALNAME_VAR, realname);
  209.     set_string_var(STATUS_FORMAT_VAR, DEFAULT_STATUS_FORMAT);
  210.     set_string_var(STATUS_AWAY_VAR, DEFAULT_STATUS_AWAY);
  211.     set_string_var(STATUS_CHANNEL_VAR, DEFAULT_STATUS_CHANNEL);
  212.     set_string_var(STATUS_CHANOP_VAR, DEFAULT_STATUS_CHANOP);
  213.     set_string_var(STATUS_CLOCK_VAR, DEFAULT_STATUS_CLOCK);
  214.     set_string_var(STATUS_HOLD_VAR, DEFAULT_STATUS_HOLD);
  215.     set_string_var(STATUS_HOLD_LINES_VAR, DEFAULT_STATUS_HOLD_LINES);
  216.     set_string_var(STATUS_INSERT_VAR, DEFAULT_STATUS_INSERT);
  217.     set_string_var(STATUS_MAIL_VAR, DEFAULT_STATUS_MAIL);
  218.     set_string_var(STATUS_MODE_VAR, DEFAULT_STATUS_MODE);
  219.     set_string_var(STATUS_OPER_VAR, DEFAULT_STATUS_OPER);
  220.     set_string_var(STATUS_OVERWRITE_VAR, DEFAULT_STATUS_OVERWRITE);
  221.     set_string_var(STATUS_QUERY_VAR, DEFAULT_STATUS_QUERY);
  222.     set_string_var(STATUS_SERVER_VAR, DEFAULT_STATUS_SERVER);
  223.     set_string_var(STATUS_UMODE_VAR, DEFAULT_STATUS_UMODE);
  224.     set_string_var(STATUS_USER_VAR, DEFAULT_STATUS_USER);
  225.     set_string_var(STATUS_USER1_VAR, DEFAULT_STATUS_USER1);
  226.     set_string_var(STATUS_USER2_VAR, DEFAULT_STATUS_USER2);
  227.     set_string_var(STATUS_USER3_VAR, DEFAULT_STATUS_USER3);
  228.     set_string_var(STATUS_WINDOW_VAR, DEFAULT_STATUS_WINDOW);
  229.     set_string_var(USERINFO_VAR, DEFAULT_USERINFO);
  230.     set_string_var(XTERM_OPTIONS_VAR, DEFAULT_XTERM_OPTIONS);
  231.     set_alarm(DEFAULT_CLOCK_ALARM);
  232.     set_beep_on_msg(DEFAULT_BEEP_ON_MSG);
  233.     set_string_var(STATUS_NOTIFY_VAR, DEFAULT_STATUS_NOTIFY);
  234.     set_string_var(CLIENTINFO_VAR, IRCII_COMMENT);
  235. #ifdef _Windows
  236.     set_string_var(TRANSLATION_VAR, "LATIN_1");
  237.     set_translation("LATIN_1");
  238. #else
  239.     set_string_var(TRANSLATION_VAR, "ASCII");
  240.     set_translation("ASCII");
  241. #endif
  242.     set_string_var(HELP_PATH_VAR, DEFAULT_HELP_PATH);
  243. #ifdef _Windows
  244.     GetPrivateProfileString("Defaults", "HelpService", "IRCIIHelp", buffer, BIG_BUFFER_SIZE, "ircii.ini");
  245.     set_string_var(HELP_SERVICE_VAR, buffer);
  246. #else
  247.     set_string_var(HELP_SERVICE_VAR, DEFAULT_HELP_SERVICE);
  248. #endif
  249.     set_lastlog_size(irc_variable[LASTLOG_VAR].integer);
  250.     set_history_size(irc_variable[HISTORY_VAR].integer);
  251.     set_history_file(irc_variable[HISTORY_FILE_VAR].string);
  252.     set_highlight_char(irc_variable[HIGHLIGHT_CHAR_VAR].string);
  253.     set_lastlog_level(irc_variable[LASTLOG_LEVEL_VAR].string);
  254.     set_notify_level(irc_variable[NOTIFY_LEVEL_VAR].string);
  255. }
  256.  
  257. /*
  258.  * find_variable: looks up variable name in the variable table and returns
  259.  * the index into the variable array of the match.  If there is no match, cnt
  260.  * is set to 0 and -1 is returned.  If more than one match the string, cnt is
  261.  * set to that number, and it returns the first match.  Index will contain
  262.  * the index into the array of the first found entry 
  263.  */
  264. int
  265. find_variable(org_name, cnt)
  266.     char    *org_name;
  267.     int    *cnt;
  268. {
  269.     IrcVariable *v,
  270.             *first;
  271.     int    len,
  272.     index;
  273.     char    *name = (char *) 0;
  274.  
  275.     malloc_strcpy(&name,org_name);
  276.     upper(name);
  277.     len = strlen(name);
  278.     index = 0;
  279.     for (first = irc_variable; first->name; first++, index++)
  280.  
  281.     {
  282.         if (strncmp(name, first->name, len) == 0)
  283.         {
  284.             *cnt = 1;
  285.             break;
  286.         }
  287.     }
  288.     if (first->name)
  289.  
  290.     {
  291.         if (strlen(first->name) != len)
  292.         {
  293.             v = first;
  294.             for (v++; v->name; v++, (*cnt)++)
  295.  
  296.             {
  297.                 if (strncmp(name, v->name, len) != 0)
  298.                     break;
  299.             }
  300.         }
  301.         new_free(&name);
  302.         return (index);
  303.     }
  304.     else
  305.  
  306.     {
  307.         *cnt = 0;
  308.         new_free(&name);
  309.         return (-1);
  310.     }
  311. }
  312.  
  313. /*
  314.  * do_boolean: just a handy thing.  Returns 1 if the str is not ON, OFF, or
  315.  * TOGGLE 
  316.  */
  317. int
  318. do_boolean(str, value)
  319.     char    *str;
  320.     int    *value;
  321. {
  322.     upper(str);
  323.     if (strcmp(str, var_settings[ON]) == 0)
  324.         *value = 1;
  325.     else if (strcmp(str, var_settings[OFF]) == 0)
  326.         *value = 0;
  327.     else if (strcmp(str, "TOGGLE") == 0)
  328.     {
  329.         if (*value)
  330.             *value = 0;
  331.         else
  332.             *value = 1;
  333.     }
  334.     else
  335.         return (1);
  336.     return (0);
  337. }
  338.  
  339. /*
  340.  * set_var_value: Given the variable structure and the string representation
  341.  * of the value, this sets the value in the most verbose and error checking
  342.  * of manors.  It displays the results of the set and executes the function
  343.  * defined in the var structure 
  344.  */
  345. void
  346. set_var_value(index, value)
  347.     int    index;
  348.     char    *value;
  349. {
  350.     char    *rest;
  351.     IrcVariable *var;
  352.     int    old;
  353.  
  354.  
  355.     var = &(irc_variable[index]);
  356. #ifdef DAEMON_UID
  357.     if (getuid() == DAEMON_UID && var->flags&VF_NODAEMON && value && *value)
  358.     {
  359.         say("You are not permitted to set that variable");
  360.         return;
  361.     }
  362. #endif
  363.     switch (var->type)
  364.     {
  365.     case BOOL_TYPE_VAR:
  366.         if (value && *value && (value = next_arg(value, &rest)))
  367.         {
  368.             old = var->integer;
  369.             if (do_boolean(value, &(var->integer)))
  370.  
  371.             {
  372.                 say("Value must be either ON, OFF, or TOGGLE");
  373.                 break;
  374.             }
  375.             if (!(var->int_flags & VIF_CHANGED))
  376.             {
  377.                 if (old != var->integer)
  378.                     var->int_flags |= VIF_CHANGED;
  379.             }
  380.             if (loading_global)
  381.                 var->int_flags |= VIF_GLOBAL;
  382.             if (var->func)
  383.                 (var->func) (var->integer);
  384.             say("Value of %s set to %s", var->name,
  385.                 var->integer ? var_settings[ON]
  386.                          : var_settings[OFF]);
  387.         }
  388.         else
  389.             say("Current value of %s is %s", var->name,
  390.                 (var->integer) ?
  391.                 var_settings[ON] : var_settings[OFF]);
  392.         break;
  393.     case CHAR_TYPE_VAR:
  394.         if (value && *value && (value = next_arg(value, &rest)))
  395.         {
  396.             if (strlen(value) > 1)
  397.                 say("Value of %s must be a single character",
  398.                     var->name);
  399.             else
  400.             {
  401.                 if (!(var->int_flags & VIF_CHANGED))
  402.                 {
  403.                     if (var->integer != *value)
  404.                         var->int_flags |= VIF_CHANGED;
  405.                 }
  406.                 if (loading_global)
  407.                     var->int_flags |= VIF_GLOBAL;
  408.                 var->integer = *value;
  409.                 if (var->func)
  410.                     (var->func) (var->integer);
  411.                 say("Value of %s set to '%c'", var->name,
  412.                     var->integer);
  413.             }
  414.         }
  415.         else
  416.             say("Current value of %s is '%c'", var->name,
  417.                 var->integer);
  418.         break;
  419.     case INT_TYPE_VAR:
  420.         if (value && *value && (value = next_arg(value, &rest)))
  421.         {
  422.             int    val;
  423.  
  424.             if (!is_number(value))
  425.             {
  426.                 say("Value of %s must be numeric!", var->name);
  427.                 break;
  428.             }
  429.             if ((val = atoi(value)) < 0)
  430.             {
  431.                 say("Value of %s must be greater than 0",
  432.                     var->name);
  433.                 break;
  434.             }
  435.             if (!(var->int_flags & VIF_CHANGED))
  436.             {
  437.                 if (var->integer != val)
  438.                     var->int_flags |= VIF_CHANGED;
  439.             }
  440.             if (loading_global)
  441.                 var->int_flags |= VIF_GLOBAL;
  442.             var->integer = val;
  443.             if (var->func)
  444.                 (var->func) (var->integer);
  445.             say("Value of %s set to %d", var->name, var->integer);
  446.         }
  447.         else
  448.             say("Current value of %s is %d", var->name,
  449.                 var->integer);
  450.         break;
  451.     case STR_TYPE_VAR:
  452.         if (value)
  453.         {
  454.             if (*value)
  455.             {
  456.                 if ((!var->int_flags & VIF_CHANGED))
  457.                 {
  458.                     if ((var->string && ! value) ||
  459.                         (! var->string && value) ||
  460.                         strcmp(var->string, value))
  461.                         var->int_flags |= VIF_CHANGED;
  462.                 }
  463.                 if (loading_global)
  464.                     var->int_flags |= VIF_GLOBAL;
  465.                 malloc_strcpy(&(var->string), value);
  466.             }
  467.             else
  468.             {
  469.                 if (var->string)
  470.                     say("Current value of %s is %s",
  471.                         var->name, var->string);
  472.                 else
  473.                     say("No value for %s has been set",
  474.                         var->name);
  475.                 return;
  476.             }
  477.         }
  478.         else
  479.             new_free(&(var->string));
  480.         if (var->func)
  481.             (var->func) (var->string);
  482.         say("Value of %s set to %s", var->name, var->string ?
  483.             var->string : "<EMPTY>");
  484.         break;
  485.     }
  486. }
  487.  
  488. /*
  489.  * set_variable: The SET command sets one of the irc variables.  The args
  490.  * should consist of "variable-name setting", where variable name can be
  491.  * partial, but non-ambbiguous, and setting depends on the variable being set 
  492.  */
  493. /*ARGSUSED*/
  494. void
  495. set_variable(command, args)
  496.     char    *command,
  497.         *args;
  498. {
  499.     char    *var;
  500.     int    no_args = 1,
  501.         cnt,
  502.         index;
  503.  
  504.     if ((var = next_arg(args, &args)) != NULL)
  505.     {
  506.         if (*var == '-')
  507.         {
  508.             var++;
  509.             args = (char *) 0;
  510.         }
  511.         index = find_variable(var, &cnt);
  512.         switch (cnt)
  513.         {
  514.         case 0:
  515.             say("No such variable \"%s\"", var);
  516.             return;
  517.         case 1:
  518.             set_var_value(index, args);
  519.             return;
  520.         default:
  521.             say("%s is ambiguous", var);
  522.             for (cnt += index; index < cnt; index++)
  523.                 set_var_value(index, empty_string);
  524.             return;
  525.         }
  526.     /* not supposed to get here anyway
  527.      * no_args = 0;
  528.      */
  529.     }
  530.     if (no_args)
  531.     {
  532.         for (index = 0; index < NUMBER_OF_VARIABLES; index++)
  533.             set_var_value(index, empty_string);
  534.     }
  535. }
  536.  
  537. /*
  538.  * get_string_var: returns the value of the string variable given as an index
  539.  * into the variable table.  Does no checking of variable types, etc 
  540.  */
  541. char    *
  542. get_string_var(var)
  543.     int    var;
  544. {
  545.     return (irc_variable[var].string);
  546. }
  547.  
  548. /*
  549.  * get_int_var: returns the value of the integer string given as an index
  550.  * into the variable table.  Does no checking of variable types, etc 
  551.  */
  552. int
  553. get_int_var(var)
  554.     int    var;
  555. {
  556.     return (irc_variable[var].integer);
  557. }
  558.  
  559. /*
  560.  * set_string_var: sets the string variable given as an index into the
  561.  * variable table to the given string.  If string is null, the current value
  562.  * of the string variable is freed and set to null 
  563.  */
  564. void
  565. set_string_var(var, string)
  566.     int    var;
  567.     char    *string;
  568. {
  569.     if (string)
  570.         malloc_strcpy(&(irc_variable[var].string), string);
  571.     else
  572.         new_free(&(irc_variable[var].string));
  573. }
  574.  
  575. /*
  576.  * set_int_var: sets the integer value of the variable given as an index into
  577.  * the variable table to the given value 
  578.  */
  579. void
  580. set_int_var(var, value)
  581.     int    var;
  582.     unsigned int    value;
  583. {
  584.     if (var == NOVICE_VAR && !load_depth && !value)
  585.     {
  586. say("WARNING: Setting NOVICE to OFF enables commands in your client which");
  587. say("         could be used by others on IRC to control your IRC session");
  588. say("         or compromise security on your machine. If somebody has");
  589. say("         asked you to do this, and you do not know EXACTLY why, or if");
  590. say("         you are not ABSOLUTELY sure what you are doing, you should");
  591. say("         immediately /SET NOVICE ON and ask the IRC operators about");
  592. say("         the commands you have been asked to enter on channel");
  593. say("         #Twilight_Zone.");
  594.     }
  595.     irc_variable[var].integer = value;
  596. }
  597.  
  598. /*
  599.  * save_variables: this writes all of the IRCII variables to the given FILE
  600.  * pointer in such a way that they can be loaded in using LOAD or the -l switch 
  601.  */
  602. void
  603. save_variables(fp, do_all)
  604.     FILE    *fp;
  605.     int    do_all;
  606. {
  607.     IrcVariable *var;
  608.  
  609.     for (var = irc_variable; var->name; var++)
  610.     {
  611.         if (!(var->int_flags & VIF_CHANGED))
  612.             continue;
  613.         if (do_all || !(var->int_flags & VIF_GLOBAL))
  614.         {
  615.             if (strcmp(var->name, "DISPLAY") == 0 || strcmp(var->name, "CLIENT_INFORMATION") == 0)
  616.                 continue;
  617.             fprintf(fp, "SET ");
  618.             switch (var->type)
  619.             {
  620.             case BOOL_TYPE_VAR:
  621.                 fprintf(fp, "%s %s\n", var->name, var->integer ?
  622.                     var_settings[ON] : var_settings[OFF]);
  623.                 break;
  624.             case CHAR_TYPE_VAR:
  625.                 fprintf(fp, "%s %c\n", var->name, var->integer);
  626.                 break;
  627.             case INT_TYPE_VAR:
  628.                 fprintf(fp, "%s %u\n", var->name, var->integer);
  629.                 break;
  630.             case STR_TYPE_VAR:
  631.                 if (var->string)
  632.                     fprintf(fp, "%s %s\n", var->name,
  633.                         var->string);
  634.                 else
  635.                     fprintf(fp, "-%s\n", var->name);
  636.                 break;
  637.             }
  638.         }
  639.     }
  640. }
  641.  
  642. char    *
  643. make_string_var(var_name)
  644.     char    *var_name;
  645. {
  646.     int    cnt,
  647.         index;
  648.     define_big_buffer(buffer);
  649.     char    *ret = (char *) 0;
  650.  
  651.     if (((index = find_variable(var_name, &cnt)) == -1) ||
  652.         (cnt > 1) ||
  653.         my_stricmp(var_name,irc_variable[index].name))
  654.     {
  655.         free_big_buffer(buffer);
  656.         return ((char *) 0);
  657.     }
  658.     switch (irc_variable[index].type)
  659.     {
  660.     case STR_TYPE_VAR:
  661.         malloc_strcpy(&ret, irc_variable[index].string);
  662.         break;
  663.     case INT_TYPE_VAR:
  664.         sprintf(buffer, "%u", irc_variable[index].integer);
  665.         malloc_strcpy(&ret, buffer);
  666.         break;
  667.     case BOOL_TYPE_VAR:
  668.         malloc_strcpy(&ret, var_settings[irc_variable[index].integer]);
  669.         break;
  670.     case CHAR_TYPE_VAR:
  671.         sprintf(buffer, "%c", irc_variable[index].integer);
  672.         malloc_strcpy(&ret, buffer);
  673.         break;
  674.     }
  675.     free_big_buffer(buffer);
  676.     return (ret);
  677. }
  678.  
  679. /* exec_warning: a warning message displayed whenever EXEC_PROTECTION is turned off.  */
  680. static    void
  681. exec_warning(value)
  682.     int    value;
  683. {
  684.     if (value == OFF)
  685.     {
  686.         say("Warning!  You have turned EXEC_PROTECTION off");
  687.         say("Please read the /HELP SET EXEC_PROTECTION documentation");
  688.     }
  689. }
  690.  
  691. static    void
  692. input_warning(value)
  693.     int    value;
  694. {
  695.     if (value == OFF)
  696.     {
  697.         say("Warning!  You have turned INPUT_PROTECTION off");
  698.         say("Please read the /HELP ON INPUT, and /HELP SET INPUT_PROTECTION documentation");
  699.     }
  700. }
  701.  
  702. /* returns the size of the character set */
  703. int
  704. charset_size()
  705. {
  706.     return get_int_var(EIGHT_BIT_CHARACTERS_VAR) ? 256 : 128;
  707. }
  708.  
  709. static    void
  710. eight_bit_characters(value)
  711.     int    value;
  712. {
  713.     if (value == ON && !term_eight_bit())
  714.         say("Warning!  Your terminal says it does not support eight bit characters");
  715.     set_term_eight_bit(value);
  716. }
  717.  
  718. static    void
  719. set_realname(value)
  720.     char    *value;
  721. {
  722.     strmcpy(realname, value, REALNAME_LEN);
  723. }
  724.